<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    
    <title>RESTful 简介 | jouyouyun&#39;s blog</title>
    <meta name="viewport" content="width=device-width,minimum-scale=1">
    <meta name="description" content="简介
RESTful 即表现层状态转换，是一种设计风格，不是标准。其要点如下：


资源由 URI 来指定
每个资源都有与之对应的 URI=，一个 =URI 只能对应一种资源，但一种资源可以对应多个 URI 不同的分类方法)。


对资源的操作对应到 HTTP 协议提供的方法
如增删改查等操作，对应 HTTP 协议的 POST, DELETE, PUT, GET 等方法


资源的表现形式通常广泛流行的协议和标准
如 JSON, XML, HTML 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己


通过操作资源的表现形式来操作资源
通过修改表现形式再辅以 HTTP 协议的方法，应用就可以管理资源


以超媒体作为应用状态的引擎
资源相关操作的 URI 可附加在表现形式内，应用根据自身状态选择相应的 URI 来更改状态。
操作可以是 URI 外，也可以是一段代码，让应用执行。

">
    <meta name="generator" content="Hugo 0.105.0">
    
    
    
    
      <meta name="robots" content="noindex, nofollow">
    

    
<link rel="stylesheet" href="/ananke/css/main.min.css" >



    
    
    
      

    

    
    
    <meta property="og:title" content="RESTful 简介" />
<meta property="og:description" content="简介
RESTful 即表现层状态转换，是一种设计风格，不是标准。其要点如下：


资源由 URI 来指定
每个资源都有与之对应的 URI=，一个 =URI 只能对应一种资源，但一种资源可以对应多个 URI 不同的分类方法)。


对资源的操作对应到 HTTP 协议提供的方法
如增删改查等操作，对应 HTTP 协议的 POST, DELETE, PUT, GET 等方法


资源的表现形式通常广泛流行的协议和标准
如 JSON, XML, HTML 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己


通过操作资源的表现形式来操作资源
通过修改表现形式再辅以 HTTP 协议的方法，应用就可以管理资源


以超媒体作为应用状态的引擎
资源相关操作的 URI 可附加在表现形式内，应用根据自身状态选择相应的 URI 来更改状态。
操作可以是 URI 外，也可以是一段代码，让应用执行。

" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://jouyouyun.github.io/post/restful-introduction/" /><meta property="article:section" content="post" />
<meta property="article:published_time" content="2018-05-10T21:38:21+08:00" />
<meta property="article:modified_time" content="2019-04-10T13:45:04+08:00" />

<meta itemprop="name" content="RESTful 简介">
<meta itemprop="description" content="简介
RESTful 即表现层状态转换，是一种设计风格，不是标准。其要点如下：


资源由 URI 来指定
每个资源都有与之对应的 URI=，一个 =URI 只能对应一种资源，但一种资源可以对应多个 URI 不同的分类方法)。


对资源的操作对应到 HTTP 协议提供的方法
如增删改查等操作，对应 HTTP 协议的 POST, DELETE, PUT, GET 等方法


资源的表现形式通常广泛流行的协议和标准
如 JSON, XML, HTML 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己


通过操作资源的表现形式来操作资源
通过修改表现形式再辅以 HTTP 协议的方法，应用就可以管理资源


以超媒体作为应用状态的引擎
资源相关操作的 URI 可附加在表现形式内，应用根据自身状态选择相应的 URI 来更改状态。
操作可以是 URI 外，也可以是一段代码，让应用执行。

"><meta itemprop="datePublished" content="2018-05-10T21:38:21+08:00" />
<meta itemprop="dateModified" content="2019-04-10T13:45:04+08:00" />
<meta itemprop="wordCount" content="125">
<meta itemprop="keywords" content="restful," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="RESTful 简介"/>
<meta name="twitter:description" content="简介
RESTful 即表现层状态转换，是一种设计风格，不是标准。其要点如下：


资源由 URI 来指定
每个资源都有与之对应的 URI=，一个 =URI 只能对应一种资源，但一种资源可以对应多个 URI 不同的分类方法)。


对资源的操作对应到 HTTP 协议提供的方法
如增删改查等操作，对应 HTTP 协议的 POST, DELETE, PUT, GET 等方法


资源的表现形式通常广泛流行的协议和标准
如 JSON, XML, HTML 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己


通过操作资源的表现形式来操作资源
通过修改表现形式再辅以 HTTP 协议的方法，应用就可以管理资源


以超媒体作为应用状态的引擎
资源相关操作的 URI 可附加在表现形式内，应用根据自身状态选择相应的 URI 来更改状态。
操作可以是 URI 外，也可以是一段代码，让应用执行。

"/>

	
  </head>

  <body class="ma0 avenir bg-near-white">

    
   
  

  <header>
    <div class="bg-black">
      <nav class="pv3 ph3 ph4-ns" role="navigation">
  <div class="flex-l justify-between items-center center">
    <a href="/" class="f3 fw2 hover-white no-underline white-90 dib">
      
        jouyouyun&#39;s blog
      
    </a>
    <div class="flex-l items-center">
      

      
        <ul class="pl0 mr3">
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/post/" title="Archives 页">
              Archives
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/tags/" title="Tags 页">
              Tags
            </a>
          </li>
          
          <li class="list f5 f4-ns fw4 dib pr3">
            <a class="hover-white no-underline white-90" href="/categories/" title="Categories 页">
              Categories
            </a>
          </li>
          
        </ul>
      
      
<div class="ananke-socials">
  
    <a href="https://github.com/jouyouyun" target="_blank" class="github ananke-social-link link-transition stackoverflow link dib z-999 pt3 pt0-l mr1" title="GitHub link" rel="noopener" aria-label="follow on GitHub——Opens in a new window">
      
        <span class="icon"><svg style="enable-background:new 0 0 512 512;" version="1.1" viewBox="0 0 512 512"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <path d="M256,32C132.3,32,32,134.8,32,261.7c0,101.5,64.2,187.5,153.2,217.9c11.2,2.1,15.3-5,15.3-11.1   c0-5.5-0.2-19.9-0.3-39.1c-62.3,13.9-75.5-30.8-75.5-30.8c-10.2-26.5-24.9-33.6-24.9-33.6c-20.3-14.3,1.5-14,1.5-14   c22.5,1.6,34.3,23.7,34.3,23.7c20,35.1,52.4,25,65.2,19.1c2-14.8,7.8-25,14.2-30.7c-49.7-5.8-102-25.5-102-113.5   c0-25.1,8.7-45.6,23-61.6c-2.3-5.8-10-29.2,2.2-60.8c0,0,18.8-6.2,61.6,23.5c17.9-5.1,37-7.6,56.1-7.7c19,0.1,38.2,2.6,56.1,7.7   c42.8-29.7,61.5-23.5,61.5-23.5c12.2,31.6,4.5,55,2.2,60.8c14.3,16.1,23,36.6,23,61.6c0,88.2-52.4,107.6-102.3,113.3   c8,7.1,15.2,21.1,15.2,42.5c0,30.7-0.3,55.5-0.3,63c0,6.1,4,13.3,15.4,11C415.9,449.1,480,363.1,480,261.7   C480,134.8,379.7,32,256,32z"/>
</svg>
</span>
      
<span class="new-window"><svg  height="8px"  style="enable-background:new 0 0 1000 1000;" version="1.1" viewBox="0 0 1000 1000"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
<path d="M598 128h298v298h-86v-152l-418 418-60-60 418-418h-152v-86zM810 810v-298h86v298c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-596c0-46 38-86 86-86h298v86h-298v596h596z" style="fill-rule:evenodd;clip-rule:evenodd;"/>
</svg>
</span></a>
  
</div>

    </div>
  </div>
</nav>

    </div>
  </header>



    <main class="pb7" role="main">
      
  
  <article class="flex-l flex-wrap justify-between mw8 center ph3">
    <header class="mt4 w-100">
      <aside class="instapaper_ignoref b helvetica tracked">
          
        POSTS
      </aside>
      










  <div id="sharing" class="mt3 ananke-socials">
    
  </div>


      <h1 class="f1 athelas mt3 mb1">RESTful 简介</h1>
      
      <p class="tracked">
         <strong>jouyouyun</strong>
      </p>
      
      
      
      <time class="f6 mv4 dib tracked" datetime="2018-05-10T21:38:21+08:00">五月 10, 2018</time>
      

      
      
    </header>
    <div class="nested-copy-line-height lh-copy serif f4 nested-links mid-gray pr4-l w-two-thirds-l"><h2 id="简介">简介</h2>
<p><code>RESTful</code> 即表现层状态转换，是一种设计风格，不是标准。其要点如下：</p>
<ul>
<li>
<p>资源由 <code>URI</code> 来指定</p>
<p>每个资源都有与之对应的 <code>URI=，一个 =URI</code> 只能对应一种资源，但一种资源可以对应多个 <code>URI</code> 不同的分类方法)。</p>
</li>
<li>
<p>对资源的操作对应到 <code>HTTP</code> 协议提供的方法</p>
<p>如增删改查等操作，对应 <code>HTTP</code> 协议的 <code>POST, DELETE, PUT, GET</code> 等方法</p>
</li>
<li>
<p>资源的表现形式通常广泛流行的协议和标准</p>
<p>如 <code>JSON, XML, HTML</code> 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己</p>
</li>
<li>
<p>通过操作资源的表现形式来操作资源</p>
<p>通过修改表现形式再辅以 <code>HTTP</code> 协议的方法，应用就可以管理资源</p>
</li>
<li>
<p>以超媒体作为应用状态的引擎</p>
<p>资源相关操作的 <code>URI</code> 可附加在表现形式内，应用根据自身状态选择相应的 <code>URI</code> 来更改状态。</p>
<p>操作可以是 <code>URI</code> 外，也可以是一段代码，让应用执行。</p>
</li>
</ul>
<p>总结起来就是：通过改变资源的表现形式来更改资源状态，以表现形式里的超媒体信息来引导应用的状态改变。</p>
<p>现在很多设计只用到了 <strong>资源 <code>+</code> <code>HTTP</code> 动词</strong> 的方式，但 <strong>超媒体</strong>  不容忽视，是与应用交互的核心。</p>
<h2 id="http-方法使用"><code>HTTP</code> 方法使用</h2>
<p>下面介绍几种常用的 <code>HTTP</code> 协议方法:</p>
<ul>
<li>
<p>POST</p>
<p>用于资源的添加</p>
</li>
<li>
<p>DELETE</p>
<p>用于资源的删除</p>
</li>
<li>
<p>PUT</p>
<p>用于修改资源，需要提供完整的资源信息，可用于修改资源多项字段</p>
</li>
<li>
<p>GET</p>
<p>用于资源的获取</p>
</li>
<li>
<p>PATCH</p>
<p>用于修改资源的单个字段</p>
</li>
</ul>
<h2 id="示例">示例</h2>
<p>如构建一个用户信息服务, <code>API</code> 按照 <code>RESTful</code> 风格可设计如下：</p>
<ul>
<li>
<p><code>[POST] /users/:user</code> 添加用户</p>
</li>
<li>
<p><code>[DELETE] /users/:user</code> 删除用户</p>
</li>
<li>
<p><code>[PUT] /users/:user</code> 修改用户整体信息</p>
</li>
<li>
<p><code>[PATCH] /users/:user</code> 修改用户的单个字段</p>
</li>
<li>
<p><code>[GET] /users/:user</code> 获取用户信息</p>
</li>
<li>
<p><code>[GET] /users</code> 获取所有用户信息</p>
</li>
</ul>
<p>另外在 <code>GET</code> 的信息中加入 <code>DELETE, PUT, PATCH</code> 的 <code>URI=，应用就可以根据这些 =URI</code> 显示可以进行的操作，动态的生成页面。
此种方法也减少了耦合，避免了 <code>URI</code> 变更时大量的修改。</p>
<hr>
<p>尽管上面的描述很简单，但也能发现采用 <code>RESTful</code> 来设计 <code>Web API</code> 是一种简洁明了的方案，通过与 <code>HTTP</code> 动词结合，避免了在 <code>URI</code> 中设置大量动词的问题，需要关注的只是对资源的抽象和划分。</p>
<p>本文到此为止，关于 <code>RESTful</code> 更多更详尽的内容请自行查找。</p>
<h2 id="参考文档">参考文档</h2>
<ul>
<li><a href="http://www.infoq.com/cn/articles/rest-introduction">深入浅出REST</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2011/09/restful.html">理解RESTful架构</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2014/05/restful%5Fapi.html">RESTful API 设计指南</a></li>
<li><a href="http://novoland.github.io/%E8%AE%BE%E8%AE%A1/2015/08/17/Restful%20API%20%E7%9A%84%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.html">Restful API 的设计规范</a></li>
</ul><ul class="pa0">
  
   <li class="list di">
     <a href="/tags/restful" class="link f5 grow no-underline br-pill ba ph3 pv2 mb2 dib black sans-serif">restful</a>
   </li>
  
</ul>
<div class="mt6 instapaper_ignoref">
      
      
      </div>
    </div>

    <aside class="w-30-l mt6-l">




</aside>

  </article>

    </main>
    <footer class="bg-black bottom-0 w-100 pa3" role="contentinfo">
  <div class="flex justify-between">
  <a class="f4 fw4 hover-white no-underline white-70 dn dib-ns pv2 ph3" href="https://jouyouyun.github.io" >
    &copy;  jouyouyun 2023 
  </a>
    <div>
<div class="ananke-socials">
  
    <a href="https://github.com/jouyouyun" target="_blank" class="github ananke-social-link link-transition stackoverflow link dib z-999 pt3 pt0-l mr1" title="GitHub link" rel="noopener" aria-label="follow on GitHub——Opens in a new window">
      
        <span class="icon"><svg style="enable-background:new 0 0 512 512;" version="1.1" viewBox="0 0 512 512"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <path d="M256,32C132.3,32,32,134.8,32,261.7c0,101.5,64.2,187.5,153.2,217.9c11.2,2.1,15.3-5,15.3-11.1   c0-5.5-0.2-19.9-0.3-39.1c-62.3,13.9-75.5-30.8-75.5-30.8c-10.2-26.5-24.9-33.6-24.9-33.6c-20.3-14.3,1.5-14,1.5-14   c22.5,1.6,34.3,23.7,34.3,23.7c20,35.1,52.4,25,65.2,19.1c2-14.8,7.8-25,14.2-30.7c-49.7-5.8-102-25.5-102-113.5   c0-25.1,8.7-45.6,23-61.6c-2.3-5.8-10-29.2,2.2-60.8c0,0,18.8-6.2,61.6,23.5c17.9-5.1,37-7.6,56.1-7.7c19,0.1,38.2,2.6,56.1,7.7   c42.8-29.7,61.5-23.5,61.5-23.5c12.2,31.6,4.5,55,2.2,60.8c14.3,16.1,23,36.6,23,61.6c0,88.2-52.4,107.6-102.3,113.3   c8,7.1,15.2,21.1,15.2,42.5c0,30.7-0.3,55.5-0.3,63c0,6.1,4,13.3,15.4,11C415.9,449.1,480,363.1,480,261.7   C480,134.8,379.7,32,256,32z"/>
</svg>
</span>
      
<span class="new-window"><svg  height="8px"  style="enable-background:new 0 0 1000 1000;" version="1.1" viewBox="0 0 1000 1000"  xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
<path d="M598 128h298v298h-86v-152l-418 418-60-60 418-418h-152v-86zM810 810v-298h86v298c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-596c0-46 38-86 86-86h298v86h-298v596h596z" style="fill-rule:evenodd;clip-rule:evenodd;"/>
</svg>
</span></a>
  
</div>
</div>
  </div>
</footer>

  </body>
</html>
